<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Freemaker</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
                    <title>各种表达式的简单用法</title>
<body>

<a href="http://freemarker.foofun.cn/dgui_template_exp.html#exp_cheatsheet">快速浏览(备忘单)</a>

<#--------------------------------------赋值操作符--------------------------------->
<#assign x = 1>
<#assign y = 1>
<#assign x += y>
<#assign x++>
${x}
<#--<#assign x += y> 是 <#assign x = x + y> 的简写，<#assign x *= y> 是 <#assign x = x * y>的简写等等。。。
<#assign x++> 和 <#assign x += 1> (或 <#assign x = x + 1>)不同，它只做算术加法运算 (如果变量不是数字的话就会失败)，
而其它的是进行字符串，序列连接和哈希表连接的重载。 <#assign x&ndash;&gt; 是 <#assign x -= 1> 的简写。-->




<#--------------------------1.遍历写法一 (重要) ----------------------------->
<ul>
    <#list list as item>
    <li>${item}
        </#list>
</ul>


<#---------------------------------2.遍历写法二(重要)  ---------------------->
<#--上面示例中的一个问题是如果我们有0个水果，
它仍然会输出一个空的 <ul></ul>，而不是什么都没有。
要避免这样的情况，可以这么来使用 list：-->
<#list list>
    <ul>
        <#items as listone>
            ${listone}<#sep>,                       <#--不换行添加逗号-->
            </#items>
    </ul>
<#else>                                             <#--在 <#list> 标签也可以使用 <#else> 语法-->
    None
</#list>

<#------------------------------3.获取变量长度/转换boolean为String(重要)  -------------------------------->

<span style="font-size: 1.5em">获取变量长度/转换boolean为String</span>
<#list list as listone>
    <ul>
     <#if bool>
         ${stringObjectMap["test1"]?length},             <#--获取长度,中阔号指定key获取-->
         ${stringObjectMap["test1"][0..5]},             <#-- 截取指定字符串-->
         ${stringObjectMap["test1"][3..]},              <#--截取指定字符串-->
         ${bool?string("Y", "N")}                       <#--装换成String类型-->
     </#if>
    </ul>
<#else>                                             <#--在 <#list> 标签也可以使用 <#else> 语法-->
    None
</#list>


<#------------------------------4.处理不存在的变量方法一(重要)  -------------------------------->

<span style="font-size: 1.5em">处理不存在的变量方法一</span>
<#list list>
    <ul>
        <#items as listone>                                 <#--通过在变量名后面跟着一个 !(叹号，译者注)和默认值-->
            <h2>欢迎${listone!"visitor"}!<#sep>,</h2>       <#--当 user 不存在于数据模型时, 模板将会将 user 的值表示为字符串 "visitor"-->
        </#items>
    </ul>
</#list>

<#------------------------------5.处理不存在的变量方法二(重要)  -------------------------------->

<span style="font-size: 1.5em">处理不存在的变量方法二</span>
<#list list as listone>
    <ul>
        <#if listone??>                                      <#--那么如果 user 变量不存在的话将会忽略整个问候的代码段：-->
            <h2>欢迎来到 ${listone}!"该值不存在！"</h2>
        </#if>
    </ul>
<#else>
    None
</#list>
<#--用于非顶层变量时，默认值操作符可以有两种使用方式：-->

<#--product.color!"red"-->
<#--1.如果是这样的写法，那么在 product 中， 当 color 不存在时(返回 "red" )， 将会被处理，
    2.但是如果连 product 都不存在时将不会处理。 也就是说这样写时变量 product 必须存在，否则模板就会报错。-->

<#--(product.color)!"red"-->
<#--1.这时，如果当 product.color 不存在时也会被处理， 那就是说，
    如果 product 不存在或者 product 存在而 color 不存在，都能显示默认值 "red" 而不会报错-->




<#------------------------------6.字符串转义字符(重要)  -------------------------------->
<#--1.在文本中确定字符串值的方法是看双引号，
比如： "some text"，或单引号，比如： 'some text'。这两种形式是等同的。
    2.如果文本自身包含用于字符引用的引号 ( " 或 ')或反斜杠时，
应该在它们的前面再加一个反斜杠；这就是转义。
转义允许直接在文本中输入任何字符， 也包括换行。-->

<#--双引号包裹字符串，如果里面再用双引号包裹字符串，则每个双引号前必须添加\进行转义,单引号则不用-->
<h1>${"It's \"quoted\" and
this is a backslash: \\"}
    <#--同理,单引号包裹字符串，如果里面再用单引号包裹字符串，则每个单引号前必须添加\进行转义,双引号则不用-->
    ${'It\'s "quoted" and
this is a backslash: \\'}</h1>

<#-----------------------------7.原生字符串(了解)------------------------------------------->
<#--1.原生字符串是一种特殊的字符串。在原生字符串中，
    2.反斜杠和 ${ 没有特殊含义， 它们被视为普通的字符。
   为了表明字符串是原生字符串， 在开始的引号或单引号之前放置字母r，例如：-->

<h1>${r"${foo}"}
    ${r"C:\foo\bar"}
</h1>

<#--------------------------------8.顶层变量(了解)-------------------------------------------->
<#--1.定义:访问顶层的变量，可以简单地使用变量名。例如， 用表达式 user 就可以在根上获取以 "user" 为名存储的变量值。
然后打印出存储在里面的内容：-->
<#--eg:${user}-->
<#--2.在这种表达式中，变量名只可以包含字母(也可以是非拉丁文)，
数字(也可以是非拉丁数字)，下划线 (_)， 美元符号 ($)，at符号 (@)。
    3.此外，第一个字符不可以是ASCII码数字(0-9)。 从 FreeMarker 2.3.22 版本开始，变量名在任何位置也可以包含负号 (-)，点(.)和冒号(:)，
但这些必须使用前置的反斜杠(\)来转义， 否则它们将被解释成操作符。比如，读取名为"data-id"的变量，
表达式为 data\-id，因为 data-id 将被解释成 "data minus id"。 (请注意，这些转义仅在标识符中起作用，而不是字符串中。)-->


<#------------------------------- 9.插值 (或连接)(重要)------------------------------------------->
<#--可在字符串中直接插入表达式-->

<#assign user= "Hello">
<#assign s = "Hello ${user}!">
${s}    <#-- Just to see what the value of s is -->
<br>
<#--另外，也可以使用 + 号来达到类似的效果：-->
<#assign s = "Hello " + user + "!">
${s}
<br>

<#--------------------------------------10.内建函数-------------------------------------------------->
<#--1.内建函数就像FreeMarker在对象中添加的方法一样。
    2.要防止和实际方法和其它子变量的命名冲突，则不能使用点 (.)，这里使用问号 (?)来和父对象分隔开。
    3.比如，想要保证 path 有起始的 / ，那么可以这么来写： path?ensure_starts_with('/')。 path 后的-->

<#assign testString = "jack & tanghs"></assign>
${testString?upper_case}<br>
${testString?html}<br>
${testString?upper_case?html}



<#-----------------------------------------11.方法调用--------------------------------------------------->
假设有个重复方法 repeat,那么方法调用如下;
<#--${repeat("Foo", 3)}-->








</body>
<#include "/copyright_footer.html">       <#--包含文件指令,比如包含一个声明版权文件颜色竟然是红的-->
</html>